package com.yl.common.utils.date;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.google.common.collect.Lists;
import com.yl.common.utils.NumberUtils;
import lombok.extern.slf4j.Slf4j;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.IntStream;

@Slf4j
public class LocalDateTimeUtils extends LocalDateTimeUtil {

    public static void main(String[] args) {
        //LocalDateTimeUtil.format(LocalDateTime.now(),"yyyy-MM-dd HH:mm:ss");

        // LocalDateTime l = LocalDateTimeUtils.getDateByDateHours(LocalDateTime.now(), 24,0,0);
        // LocalDateTime l2 = LocalDateTimeUtils.getDateByDateHours(LocalDateTime.now(), 1,59,59);
        // System.out.println(LocalDateTimeUtil.format(l,"yyyy-MM-dd HH:mm:ss"));
        // System.out.println("-----------------");
        // System.out.println(LocalDateTimeUtil.format(l2,"yyyy-MM-dd HH:mm:ss"));
        // System.out.println("-----------------");
        // List<LocalDateTime> dateByDateHours = LocalDateTimeUtils.getDateListByDateHours(LocalDateTime.now(), 24);
        // for(LocalDateTime i:dateByDateHours){
        //     System.out.println(LocalDateTimeUtil.format(i,"yyyy-MM-dd HH:mm:ss"));
        // }

        // int year = 2023; // 指定年份
        // int month = 3; // 指定月份
        //
        // YearMonth yearMonth = YearMonth.of(year, month);
        // int daysInMonth = yearMonth.lengthOfMonth(); // 获取该月份的天数
        //
        // for (int day = 1; day <= daysInMonth; day++) {
        //     LocalDate date = yearMonth.atDay(day); // 获取指定日期的 LocalDate 对象
        //     System.out.println(date);
        // }

        String str = "2019-07-24 18:00:00";
        DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime ldt = LocalDateTime.parse(str, dateTimeFormat);
        ldt = ldt.plusSeconds(1).plusMinutes(1).plusHours(1).plusDays(1);
        System.out.println(dateTimeFormat.format(ldt));
    }

    /**
     * 获取指定月份的所有天数
     * @return
     */
    public static List<Integer> getAllMonth(){
        return Lists.newArrayList(1,2,3,4,5,6,7,8,9,10,11,12);
    }

    /**
     * 获取指定月份的所有天数
     * @return
     */
    public static List<Integer> getDayByMonth(int year,int month){
        YearMonth yearMonth = YearMonth.of(year, month);
        // 获取该月份的天数
        int daysInMonth = yearMonth.lengthOfMonth();

        List<Integer> days = new ArrayList<>();
        for (int day = 1; day <= daysInMonth; day++) {
            LocalDate date = yearMonth.atDay(day);
            days.add(date.getDayOfMonth());
        }
        return days;
    }

    /**
     * 获取指定月份的所有日期
     * @return
     */
    public static List<LocalDateTime> getDayDateByMonth(int year,int month){
        LocalDateTime localDateTime = LocalDateTime.of(year,month,1,0,0,0);
        // 获取当前月份的最大天数
        int maxDayOfCurrentMonth = localDateTime.getDayOfMonth();
        List<LocalDateTime> localDateTimes = new ArrayList<>();
        IntStream.rangeClosed(1, maxDayOfCurrentMonth).forEach(day -> {
            // 创建日期时间对象
            LocalDateTime date = LocalDateTime.of(localDateTime.getYear(), month, day, 0, 0);
            localDateTimes.add(date);
        });
        return localDateTimes;
    }

    /**
     * 获取指定日期近N天日期的天数
     * @return
     */
    public static List<Integer> getDayByTimeNum(LocalDateTime ldt,Integer num){
        if(Objects.isNull(ldt)|| NumberUtils.integerEmpty(num)){
            return new ArrayList<>();
        }
        LocalDateTime ldt2 = LocalDateTime.of(ldt.getYear(),ldt.getMonthValue(),ldt.getDayOfMonth(),0,0,0);


        List list = new ArrayList();
        num = num-1;
        for(int i=num;i>=0;i--){
            LocalDateTime ldt3 = ldt2.plusDays(-i);
            list.add(ldt3.getDayOfMonth());
        }
        return list;
    }

    /**
     * 获取指定日期近N天日期的天数 返回List<String> String=月-日
     * @return
     */
    public static List<String> getDayByTimeNum2(LocalDateTime ldt,Integer num){
        if(Objects.isNull(ldt)|| NumberUtils.integerEmpty(num)){
            return new ArrayList<>();
        }
        LocalDateTime ldt2 = LocalDateTime.of(ldt.getYear(),ldt.getMonthValue(),ldt.getDayOfMonth(),0,0,0);


        List list = new ArrayList();
        num = num-1;
        for(int i=num;i>=0;i--){
            LocalDateTime ldt3 = ldt2.plusDays(-i);
            list.add(ldt3.getMonthValue()+"-"+ldt3.getDayOfMonth());
        }
        return list;
    }

    /**
     * 获取指定日期 指定近多少小时的日期列表
     * ldt 指定日期
     * num 指定近多少的小数数
     * @return
     */
    public static List<LocalDateTime> getDateListByDateHours(LocalDateTime ldt,Integer num){
        List<LocalDateTime> list = new ArrayList<>();
        if(Objects.isNull(ldt)||NumberUtils.integerEmpty(num)||num<0){
            return list;
        }
        for(int i=num-1;i>=0;i--){
            LocalDateTime localDateTime = ldt.plusHours(-(i));
            list.add(localDateTime);
        }
        return list;
    }

    /**
     * 获取指定日期 指定近多少小时的日期
     * ldt 指定日期
     * num 指定近多少的小时数
     * minute 补充的分钟数 一般是0或59
     * second 补充的秒数 一般是0或59
     */
    public static LocalDateTime getDateByDateHours(
            LocalDateTime ldt,
            Integer num,
            Integer minute,
            Integer second
    ){
        if(Objects.isNull(ldt)||NumberUtils.integerEmpty(num)||num<0){
            return null;
        }
        if(Objects.isNull(minute)){
            minute = 0;
        }
        if(Objects.isNull(second)){
            second = 0;
        }

        num = num-1;
        ldt = ldt.plusHours(-num);
        ldt = LocalDateTime.of(
                ldt.getYear(),
                ldt.getMonthValue(),
                ldt.getDayOfMonth(),
                ldt.getHour(),
                minute,
                second
        );
        return ldt;
    }

    /**
     * 获取指定日期和当前日期的差值
     * @param appointDateTime 指定的时间
     * @param now 当前时间
     * @return String 例如 1分钟前 1小时前 1天前
     */
    public static String getTimeDifference(LocalDateTime appointDateTime,LocalDateTime now) {
        /*
        此方法的判断思路如下
        1
            1小时之内：展示“X分钟前”。时间间隔在2分30秒前，展示“2分钟前"
            特例：时间间隔小于1分钟，展示“1分钟前”
        2
            1-24小时之内：展示“X小时前”。时间间隔在3小时20分钟前，展示“3小时前"
        3
            大于24小时：展示“X天前”。时间间隔在1天2小时前，展示“1天前"
         */
        Duration duration = Duration.between(appointDateTime, now);

        long minutes = duration.toMinutes();
        long hours = duration.toHours();
        long days = duration.toDays();

        if (minutes < 1) {
            return "1分钟前";
        } else if (minutes < 60) {
            return minutes + "分钟前";
        } else if (hours < 24) {
            return hours + "小时前";
        } else {
            return days + "天前";
        }
    }


}
